#include <iostream>
#include "Date.h"

class Date
{
public:
    Date(int year = 1900, int month = 1, int day = 1) // 构造函数
    {
        _year = year;
        _month = month;
        _day = day;
        if (month < 1 || month > 12 || day < 1 || day > GetMonthDay(year, month))
        // 这里一定要先检查month,如果先进行GetMonthDay(),可能会造成越界访问
        {
            cout << "非法日期：" << endl;
            Print();
        }
    };
    // 不存在内存开辟的问题，使用默认的析构函数即可

    int GetMonthDay(int year, int month)
    {
        assert(month > 0 && month < 13);

        static int MonthDay[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        if ((month == 2) && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
            return 29;

        return MonthDay[month];
    }

    // 下面是运算符重载
    bool operator<(const Date &d)
    {
        if (_year < d._year)
        {
            return true;
        }
        else if (_year == d._year && _month < d._month)
        {
            return true;
        }
        else if (_year == d._year && _month == d._month && _day < d._day)
        {
            return true;
        }
        return false;
    }

    bool operator==(const Date &d)
    {
        return _year == d._year && _month == d._month && _day == d._day;
    }

    bool operator<=(const Date &d)
    {
        return *this < d || *this == d;
    }

    bool operator>(const Date &d)
    {
        return !(*this <= d);
    }

    bool operator>=(const Date &d)
    {
        return !(*this < d);
    }

    bool operator!=(const Date &d)
    {
        return !(*this == d);
    }

    void Print()
    {
        cout << _year << "/" << _month << "/" << _day << endl;
    }

    // 赋值重载
    void operator=(const Date &d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }

    Date &operator+=(int day) // 直接改变原来的值
    {
        _day += day;
        while (_day > GetMonthDay(_year, _month))
        {
            _day -= GetMonthDay(_year, _month);
            _month++;
            if (_month == 13)
            {
                _year++;
                _month = 1;
            }
        }
        return *this;
    }

    Date operator+(int day)
    {
        Date tmp = *this;
        tmp += day;
        return tmp;
    }

    Date &operator-=(int day)
    {
        if (day < 0)
        {
            *this += (-day);
            return *this;
        }
        _day -= day;
        while (_day <= 0)
        {
            _day += GetMonthDay(_year, _month);
            _month--;
            if (_month == 0)
            {
                _year--;
                _month = 12;
            }
        }
        return *this;
    }

    Date Date::operator-(int day)
    {
        Date tmp = *this;
        tmp -= day;
        return tmp;
    }

    Date Date::operator++()
    {
        *this += 1;
        return *this;
    }
    Date Date::operator++(int)
    {
        Date tmp(*this);
        *this += 1;
        return tmp;
    }

    Date Date::operator--()
    {
        *this -= 1;
        return *this;
    }
    Date Date::operator--(int)
    {
        Date ret = *this;
        *this -= 1;
        return ret;
    }

    int Date::operator-(const Date &d)
    {
        Date max = *this;
        Date min = d;
        int flag = 1;
        if (*this < d)
        {
            max = d;
            min = *this;
            flag = -1;
        }
        int n = 0;
        while (min != max) // 这里不建议使用 < ， 小于的操作比 != 相对来说
        {
            ++min;
            ++n;
        }

        return n * flag;
    }

private:
    int _year;
    int _month;
    int _day;
};